package com.modebing.activiti7.listener;

import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.ExecutionListener;
import org.activiti.engine.delegate.TaskListener;
import org.springframework.stereotype.Component;

/**
 * 多功能监听器
 * 同时实现执行监听器和任务监听器接口
 */
@Component("approvalListener") // Bean 名称，流程中通过 ${multiPurposeListener} 引用
@Slf4j
public class ApprovalListener implements ExecutionListener, TaskListener {
    // ====================== 执行监听器逻辑（处理流程 / 节点事件） ======================
    @Override
    public void notify(DelegateExecution execution) {
        log.error("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:{}","执行同意流程");
// 执行监听器的事件类型（流程启动、节点开始 / 结束等）
        String eventName = execution.getEventName();
        String processInstanceId = execution.getProcessInstanceId();
        String activityId = execution.getCurrentActivityId(); // 当前节点 ID
        // 根据执行监听器的事件类型处理逻辑
        switch (eventName) {
            case EVENTNAME_START:
                if (execution.getProcessInstanceId().equals(execution.getId())) {
                    // 流程实例启动事件
                    System.out.println("[执行监听器] 流程实例启动：" + processInstanceId);
                    // 可执行初始化操作，如记录流程启动日志
                } else {
// 节点启动事件
                    System.out.println("[执行监听器] 节点启动：" + activityId + "（流程实例：" + processInstanceId + "）");
                }
                break;
            case EVENTNAME_END:
                if (execution.getProcessInstanceId().equals(execution.getId())) {
                    // 流程实例结束事件
                    System.out.println("[执行监听器] 流程实例结束：" + processInstanceId);
                    // 可执行清理操作，如归档流程数据
                } else {
                    // 节点结束事件
                    System.out.println("[执行监听器] 节点结束：" + activityId + "（流程实例：" + processInstanceId + "）");
                }
                break;
            default:
                System.out.println("[执行监听器] 其他事件：" + eventName);
        }
    }

    // ====================== 任务监听器逻辑（处理用户任务事件） ======================
    @Override
    public void notify(DelegateTask delegateTask) {
// 任务监听器的事件类型（任务创建、签收、完成等）
        String eventName = delegateTask.getEventName();
        String taskId = delegateTask.getId();
        String taskName = delegateTask.getName();
// 根据任务监听器的事件类型处理逻辑
        switch (eventName) {
            case EVENTNAME_CREATE:
// 任务创建事件（任务刚生成，未分配办理人）
                System.out.println("[任务监听器] 任务创建：" + taskName + "（ID：" + taskId + "）");
// 示例：动态分配办理人（从流程变量获取）
                String assignee = (String) delegateTask.getVariable("taskAssignee");
                if (assignee != null) {
                    delegateTask.setAssignee(assignee);
                    System.out.println("[任务监听器] 任务分配办理人：" + assignee);
                }
                break;
            case EVENTNAME_ASSIGNMENT:
// 任务分配事件（办理人被设置时触发）
                System.out.println("[任务监听器] 任务分配：" + taskName + "-> 办理人：" + delegateTask.getAssignee());
                break;
            case EVENTNAME_COMPLETE:
// 任务完成事件（任务被处理完成时触发）
                System.out.println("[任务监听器] 任务完成：" + taskName + "（ID：" + taskId + "）");
// 示例：记录任务完成结果
                String result = (String) delegateTask.getVariable("approvalResult");
                System.out.println("[任务监听器] 任务处理结果：" + result);
                break;
            default:
                System.out.println("[任务监听器] 其他事件：" + eventName);
        }
    }
}